/**
 * @author bigZ
 * @date 2019/4/22
 */

const others = {
  install(_Vue) {
    if (!_Vue) {
      return false;
    }

    _Vue && (this.__Vue = _Vue);

    this.addData();
    this.addLifeHooks();
    this.addMethods();
  },
  //添加通用数据
  addData() {
    this.__Vue.mixin({
      data() {
        return {
          window_events_map: {}, //系统事件
          document_events_map: {}, //文档事件
        };
      },
    });
  },
  //添加生命周期
  addLifeHooks() {
    this.__Vue.mixin({
      beforeDestroy() {
        for (let evtName in this.window_events_map) {
          let events = this.window_events_map[evtName];
          for (let key in events) {
            window.removeEventListener(evtName, events[key]);
          }
        }
        for (let evtName in this.document_events_map) {
          let events = this.document_events_map[evtName];
          for (let key in events) {
            document.removeEventListener(evtName, events[key]);
          }
        }
      },
    });
  },
  //添加通用方法
  addMethods() {
    this.__Vue.mixin({
      methods: {
        /**
         * 添加监听事件
         * @param evtName
         * @param func
         * @param initRun 是否在注册的时候主动触发一次
         */
        $onWin(evtName, func, initRun) {
          if (typeof func !== "function") {
            return;
          }
          !this.window_events_map[evtName] &&
            (this.window_events_map[evtName] = {});
          let key = this.$funcs.randomId();
          this.window_events_map[evtName][key] = func;
          window.addEventListener(evtName, func);
          initRun && func(true);
        },
        /**
         * 添加监听事件
         * @param evtName
         * @param func
         * @param initRun 是否在注册的时候主动触发一次
         */
        $onDoc(evtName, func, initRun) {
          if (typeof func !== "function") {
            return;
          }
          !this.document_events_map[evtName] &&
            (this.document_events_map[evtName] = {});
          let key = this.$funcs.randomId();
          this.document_events_map[evtName][key] = func;
          document.addEventListener(evtName, func);
          initRun && func(true);
        },
      },
    });
  },
};

export default others;
